package com.utils;

import org.apache.commons.lang3.StringUtils;

import com.entity.EIException;

/**
 * SQL过滤
 *
 * 该类用于过滤 SQL 注入相关的非法字符，确保防止 SQL 注入攻击。它对输入的字符串进行处理，去掉可能的恶意字符，
 * 并检查字符串中是否包含可能的 SQL 关键字，如果包含，则抛出自定义异常。
 *
 * @author team10
 */
public class SQLFilter {

    /**
     * SQL注入过滤
     *
     * 该方法会检查输入字符串是否包含 SQL 注入的潜在威胁字符，如果包含，则会抛出异常。它首先去除输入中的
     * 特殊字符，并将字符串转换为小写，然后检查是否包含 SQL 关键字。
     *
     * @param str  待验证的字符串
     * @return 过滤后的字符串，如果包含非法字符则抛出异常
     * @throws EIException  如果字符串包含 SQL 注入的危险关键字，则抛出异常
     */
    public static String sqlInject(String str){
        // 判断字符串是否为空或仅包含空格
        if(StringUtils.isBlank(str)){
            return null;
        }

        // 去掉特殊字符，防止SQL注入
        str = StringUtils.replace(str, "'", "");  // 去掉单引号
        str = StringUtils.replace(str, "\"", "");  // 去掉双引号
        str = StringUtils.replace(str, ";", "");  // 去掉分号
        str = StringUtils.replace(str, "\\", "");  // 去掉反斜杠

        // 转换成小写
        str = str.toLowerCase();

        // 定义SQL注入关键字
        String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"};

        // 判断是否包含非法字符
        for(String keyword : keywords){
            // 如果包含非法关键字，则抛出异常
            if(str.indexOf(keyword) != -1){
                throw new EIException("包含非法字符");
            }
        }

        return str;  // 返回过滤后的字符串
    }
}
